package com.cmwa.solution.base.controller;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.springframework.ui.ModelMap;


@SuppressWarnings("unchecked")
public abstract class BaseController {
	
	protected Map<String, String> getParams(HttpServletRequest request) {
		Map<String, String> params = new HashMap<String, String>();
		try{
			Enumeration<String> keys = request.getParameterNames();
			if(keys==null){
				return params;
			}
			while(keys.hasMoreElements()){
				String key = keys.nextElement();
				String value = new String(((String)request.getParameter(key)).getBytes("ISO-8859-1"), "UTF-8");
				if(StringUtils.isNotEmpty(value)){
					params.put(key, value);
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return params;
	}
	
	protected void paramModel(HttpServletRequest request,ModelMap model) {
		try{
			Enumeration<String> keys = request.getParameterNames();
			if(keys==null){
				return;
			}
			while(keys.hasMoreElements()){
				String key = keys.nextElement();
				String value = new String(((String)request.getParameter(key)).getBytes("ISO-8859-1"), "UTF-8");
				if(StringUtils.isNotEmpty(value)){
					model.addAttribute(key, value);
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	/**
	 * 重定向到成功页面
	 * @return
	 */
	protected String redirectSuccess() {
		return "system/hint/success";
	}
	
	/**
	 * 执行失败，跳转到失败页面
	 * @return
	 */
	protected String redirectExecFaild() {
		return "system/hint/validateFailed";
	}
	
	protected String redirectCustom() {
		return "custom";
	}
	
	/**
	 * 获取用户真实IP地址，不使用request.getRemoteAddr()的原因是有可能用户使用了代理软件方式避免真实IP地址, 
	 * 可是，如果通过了多级反向代理的话，X-Forwarded-For的值并不止一个，而是一串IP值 
	 * @author ex-hejm
	 * @date 2019年2月27日上午11:15:54
	 * @param request
	 * @return
	 */
	protected String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for"); 
        System.out.println("x-forwarded-for ip: " + ip);
        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {  
            // 多次反向代理后会有多个ip值，第一个ip才是真实ip
            if( ip.indexOf(",")!=-1 ){
                ip = ip.split(",")[0];
            }
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("Proxy-Client-IP");  
            System.out.println("Proxy-Client-IP ip: " + ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("WL-Proxy-Client-IP");  
            System.out.println("WL-Proxy-Client-IP ip: " + ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_CLIENT_IP");  
            System.out.println("HTTP_CLIENT_IP ip: " + ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
            System.out.println("HTTP_X_FORWARDED_FOR ip: " + ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("X-Real-IP");  
            System.out.println("X-Real-IP ip: " + ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getRemoteAddr();  
            System.out.println("getRemoteAddr ip: " + ip);
        } 
        System.out.println("获取客户端ip: " + ip);
        return ip;  
    }
}
